iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 28
0
Mobile Development

Android Architecture Components 學習心得筆記系列 第 28

Day 28 WorkManager (一) 介紹與基本使用

  • 分享至 

  • xImage
  •  

WorkManager (一) 介紹與基本使用

我為什麼要用 WorkManager

https://ithelp.ithome.com.tw/upload/images/20191004/20119398OA3jATgcqF.png
來源: Android Jetpack WorkManager | Android 中文教学视频

Android 要執行背景任務時有很多選擇,每種選擇都各有優缺點、特性和限制,特別是對於 API 版本的兼容性,讓開發者必須在程式裡寫冗長的判斷式,再換成不同的執行方法...
https://ithelp.ithome.com.tw/upload/images/20191004/201193989qp87qwJQZ.png

這時候就很推薦使用 Google 推出的新元件 WorkManager

WorkManager 支持 API 14 或以上的版本(使用率超過99%),且能夠根據版本的不同,智慧的選擇使用 JobSchedule 或是 AlarmManager 來操作後台任務,省去了寫一堆判斷 api 版本的麻煩。

使用時機

管理和調度可延遲的,且必須要被執行的任務。

例如
向伺服器發送數據分析資料,不需要馬上執行,但又必須保證在未來某個時間點完成這項任務。

WorkManager 幾個比較重要的類別

  • Worker
    任務的執行者,在 doWork 裡面完成要執行的任務並回傳執行結果

  • WorkRequest
    指定 Worker 執行任務,並設定執行的環境,執行的順序等,
    並使用它的子類 OneTimeWorkRequestPeriodicWorkRequest 來決定要讓這個任務執行一次或多次。

  • WorkManager
    管理任務請求和任務本身,並且為發起的 WorkRequest 設定排程和進入執行隊列的時機。

  • WorkStatus
    任務的狀態和任務的信息,以 LiveData 的形式提供給觀察者。

使用

添加依賴

dependencies {

    implementation "androidx.work:work-runtime-ktx:2.2.0"
}

定義 Worker 類別,在 doWork() 裡執行任務

class MyWorker(context: Context, params: WorkerParameters) : Worker(context, params) {

    override fun doWork(): Result {

        Log.d("doWork", " inputData " + inputData.getString("InputDataKey"))

        val outputData = workDataOf("OutputDataKey" to "OutputDataValue")

        return Result.success(outputData)
    }
}

inputData 當作 Bundle 來使用就可以了,並用 Key-Value 的形式來獲取數據。
回傳的 outputData 一樣是用 Key-Value 的形式來傳遞數據,但塞在 Result 裡的參數必須透過 fun workDataOf 轉換成 Data 型態

@SuppressLint("RestrictedApi")
fun workDataOf(vararg pairs: Pair<String, Any?>): Data {
    val dataBuilder = Data.Builder()
    for (pair in pairs) {
        dataBuilder.put(pair.first, pair.second)
    }
    return dataBuilder.build()
}

定義 WorkRequest

val request = OneTimeWorkRequest.Builder(MyWorker::class.java).build()

加入任務隊列

WorkManager.getInstance().enqueue(request)

取得任務狀態 WorkStatus

WorkManager.getInstance()
        .getStatusById(request.id)
        .observe(this, Observer { workStatus ->
            if (workStatus != null && workStatus.state.isFinished) {
                Log.d("outputData", workStatus.outputData.getString("OutputDataKey", ""))
            }
        })

到這邊就完成了最簡單的 WorkManager 的使用,明天繼續研究 WorkManager 的進階用法

有任何問題或講得不清楚的地方歡迎留言和我討論。

更歡迎留言糾正我任何說錯的地方!

下一篇:WorkManager (Last) 進階用法與總結


上一篇
Day 27 Navigation (Last) Nested navigation set Arguments
下一篇
Day 29 WorkManager (Last) 進階用法與總結
系列文
Android Architecture Components 學習心得筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言